加载资源
在运行时动态加载和替换资源。
资源处理方法
Rive 文件中的资源可以通过多种方 式加载:内嵌(embedded)、引用(referenced)或通过 CDN 托管。
使用资源处理器 API
实例化新的 RiveAnimationView 时,设置 riveAssetLoaderClass 属性,其值为负责处理运行时资源加载的类的完整路径字符串。
通过 XML
<app.rive.runtime.kotlin.RiveAnimationView
android:id="@+id/rive_font_load_simple"
app:riveStateMachine="State Machine 1"
app:riveAssetLoaderClass="app.rive.runtime.example.HandleRiveFontAsset"
app:riveResource="@raw/acqua_text" />
在伴随的 Activity 中,创建一个类实现 Rive 运行时的 ContextAssetLoader 抽象类,重写 loadContents 函数:
asset:FileAsset对象的引用,可获取名称、资源类型等属性bytes:资源的字节数组(如内嵌资源)
override fun loadContents(asset: FileAsset, inBandBytes: ByteArray): Boolean
重要:返回值为
boolean。如果你自己处理资源加载,返回true;如果让运行时尝试加载,返回false。
示例
package app.rive.runtime.example
import android.content.Context
import android.os.Bundle
import android.widget.FrameLayout
import androidx.appcompat.app.AppCompatActivity
import app.rive.runtime.kotlin.core.ExperimentalAssetLoader
import app.rive.runtime.kotlin.core.FileAsset
import app.rive.runtime.kotlin.core.ContextAssetLoader
import kotlin.random.Random
class FontLoadActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.rive_font_load_simple)
}
}
open class HandleSimpleRiveAsset(context: Context) : ContextAssetLoader(context) {
private val fontPool = arrayOf(
R.raw.montserrat,
R.raw.opensans,
)
override fun loadContents(asset: FileAsset, inBandBytes: ByteArray): Boolean {
val randFontIndex = Random.nextInt(fontPool.size)
val fontToLoad = fontPool[randFontIndex]
context.resources.openRawResource(fontToLoad).use {
return asset.decode(it.readBytes())
}
}
}